<?php

namespace DP\EventBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use DP\EventBundle\Entity;
use DP\EventBundle\Entity\Event;
use DP\EventBundle\Form\EventType;
use DP\EventBundle\Form\EventHandler;
use JMS\SecurityExtraBundle\Annotation\Secure;

class EventController extends Controller
{
    
	public function indexAction($int_page)
	{
		// On récupère le repository
		$obj_repository = $this->getDoctrine()->getEntityManager()->getRepository('DPEventBundle:Event');
	
		// On récupère le nombre total d'articles
		$int_nb_events = $obj_repository->getTotal();
	
		// On définit le nombre d'articles par page
		$int_nb_events_page = 5;
	
		// On calcule le nombre total de pages
		$int_nb_pages = $int_nb_events == 0 ? 1 : ceil($int_nb_events/$int_nb_events_page);
	
		// On va récupérer les articles à partir du N-ième article :
		$int_offset = ($int_page - 1) * $int_nb_events_page;
	
		// Ici on a changé la condition pour déclencher une erreur 404 lorsque la page est inférieur à 1 ou supérieur au nombre max.
		if ( $int_page < 1 OR ( $int_page > $int_nb_pages && $int_page != 1 ) )
		{
			throw $this->createNotFoundException('Page inexistante (page = ' . $int_page . ')');
		}
	
		// On récupère les articles qu'il faut grâce à findBy() :
		$arr_events = $obj_repository->findBy(
			array(),                  // Pas de critère
			array('date_publication' => 'asc'),  // On tri par date décroissante
			$int_nb_events_page,      // On sélectionne $nb_events_page articles
			$int_offset               // A partir du $offset ième
		);
	
		return $this->render('DPEventBundle:Event:index.html.twig', array (
			'arr_events'   => $arr_events,
			'int_page'     => $int_page, // On transmet à la vue la page courante,
			'int_nb_pages' => $int_nb_pages  // Et le nombre total de pages.
		));
	}
	
    public function viewAction(Event $obj_event)
    {	
        return $this->render('DPEventBundle:Event:view.html.twig', array('obj_event' => $obj_event));
    }
    
    /**
     * @Secure(roles="ROLE_AUTEUR")
     */
    public function createAction()
    {
    	$obj_event = new Event();

	    // J'ai raccourci cette partie, car plus rapide à écrire !
    	$obj_form = $this->createForm(new EventType, $obj_event);
    	
    	// On crée le gestionnaire pour ce formulaire, avec les outils dont il a besoin
        $obj_form_handler = new EventHandler($obj_form, $this->get('request'), $this->getDoctrine()->getEntityManager());

        // on lie un user à l'événement
        $obj_event->setUser($this->container->get('security.context')->getToken()->getUser());
        
        // On exécute le traitement du formulaire. S'il retourne true, alors le formulaire a bien été traité
        if ( $obj_form_handler->process() )
        {
            return $this->redirect( $this->generateUrl('dpevent_view', array('id' => $obj_event->getId())) );
        }
	
	    // Et s'il retourne false alors la requête n'était pas en POST ou le formulaire non valide.
        // On réaffiche donc le formulaire.
	    return $this->render('DPEventBundle:Event:create.html.twig', array(
	        'obj_form' => $obj_form->createView(),
	    ));
    }
    
    /**
     * @Secure(roles="ROLE_AUTEUR")
     */
    public function modifyAction($int_id)
    {
    	$obj_em = $this->getDoctrine()->getEntityManager();

        // On vérifie que l'article d'id $id existe bien, sinon, erreur 404.
        if ( ! $obj_event = $obj_em->getRepository('DP\EventBundle\Entity\Event')->find($int_id) )
        {
            throw $this->createNotFoundException('Event[id=' . $int_id . '] inexistant');
        }

        // On passe l'$obj_event récupéré au formulaire
        $obj_form = $this->createForm(new EventType, $obj_event);
        $obj_form_handler = new EventHandler($obj_form, $this->get('request'), $obj_em);

        if ($obj_form_handler->process())
        {
            return $this->redirect( $this->generateUrl('dpevent_view', array('id' => $obj_event->getId())) );
        }

        return $this->render('DPEventBundle:Event:modify.html.twig', array(
            'obj_form' => $obj_form->createView(),
        	'obj_event' => $obj_event
        ));
    }

    /**
     * @Secure(roles="ROLE_AUTEUR")
     */
    public function deleteAction(Event $obj_event)
    {
    	if ( $this->get('request')->getMethod() == 'POST' )
    	{
    		// On supprime l'événement
    		$obj_em = $this->getDoctrine()->getEntityManager();
    		$obj_em->remove($obj_event);
    		$obj_em->flush();
    		
    		// Si la requête est en POST, on supprimera l'article.
    		$this->get('session')->setFlash('info', 'L\'événement a bien été supprimé');
    	
    		// Puis on redirige vers l'accueil.
    		return $this->redirect( $this->generateUrl('dpevent_accueil') );
    	}
    	 
    	// Si la requête est en GET, on affiche une page de confirmation avant de supprimer.
    	return $this->render('DPEventBundle:Event:delete.html.twig', array('obj_event' => $obj_event));
    }
    
}
